#include "StdAfx.h"
//-------------------------------------------------------------------------------------------------
//OspacsDb.h  - Implementation of OspacsDb, concrete Implementation of APDatabase for actual database access          
//-------------------------------------------------------------------------------------------------
//FreeBSD License
//Copyright 2011 Will Stott All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are
//permitted provided that the following conditions are met:
//
//   1. Redistributions of source code must retain the above copyright notice, this list of
//      conditions and the following disclaimer.
//
//   2. Redistributions in binary form must reproduce the above copyright notice, this list
//      of conditions and the following disclaimer in the documentation and/or other materials
//      provided with the distribution.
//
//THIS SOFTWARE IS PROVIDED BY Will Stott ``AS IS'' AND ANY EXPRESS OR IMPLIED
//WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
//FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Will Stott OR
//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
//ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
//ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//The views and conclusions contained in the software and documentation are those of the
//authors and should not be interpreted as representing official policies, either expressed
//or implied, of Will Stott.
//
//----Authors--------------------------------------------------------------------------------------
//created by: will.stott@ucl.ac.uk Feb 2011
//
//----Comments-------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------

#include <iostream>
#include <string>

#include "ImageRec.h"
#include "OspacsDb.h"


OspacsDb::OspacsDb(void)
{
	_ImageRecord = new CImageRec;
}


OspacsDb::~OspacsDb(void)
{
	delete _ImageRecord;
}

LPCOLESTR OspacsDb::GetConnectStr(TCHAR *DbConnectionLabel) 
{ 
	LPOLESTR rc = '\0';

	HKEY hk; 
    long n = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\UCL-IfWH\\ArchiveProcGUI\\Database\\"), 0, KEY_QUERY_VALUE, &hk ); 
    if ( n == ERROR_SUCCESS ) 
	{ 
		DWORD val = 490;
		if ( RegQueryValueEx(hk, DbConnectionLabel, NULL, NULL, (LPBYTE)_buffer, &val) == ERROR_SUCCESS)
		{
			rc = W2OLE((wchar_t*)_buffer);
		}
    } 
	return rc; 
}

bool OspacsDb::OpenDbSession(TCHAR *DbConnectionLabel)
{
	bool rc = false;

	LPCOLESTR connectStr = GetConnectStr(DbConnectionLabel); 
	if (connectStr != '\0')
	{
		CDataSource _db;
		HRESULT hr;

		hr = _db.OpenFromInitializationString(connectStr);
		if (FAILED(hr))
		{
	#ifdef _DEBUG
			AtlTraceErrorRecords(hr);
	#endif
		}
		else
		{
			hr = _ImageRecord->m_session.Open(_db);
			if (FAILED(hr))
			{
		#ifdef _DEBUG
					AtlTraceErrorRecords(hr);
		#endif
			}
			else
			{
				rc = true;
			}
		}
	}
	return rc;
}

void  OspacsDb::CloseDbSession()
{
	_ImageRecord->m_session.Close();
}


void  OspacsDb::GetRecords(LPCOLESTR SqlQuery, int maxRecords)
{
		using std::cout;
		using std::wcout;
		using std::endl;

		HRESULT hr = 0L;

		hr = _ImageRecord->Open(_ImageRecord->m_session, SqlQuery, NULL);

		if(FAILED(hr))
		{
#ifdef _DEBUG
			AtlTraceErrorRecords(hr);
#endif
		}
		else
		{
			hr = _ImageRecord->MoveFirst(); 

			if(FAILED(hr))
			{
	#ifdef _DEBUG
				AtlTraceErrorRecords(hr);
	#endif
			}
			else
			{
				if ( _ImageRecord->m_dwDicomFileStatus == DBSTATUS_S_OK ) 
				{
					for (unsigned int x = 0; x < _ImageRecord->m_dwDicomFileLength; x++ )
					{
						cout << std::hex << (int)_ImageRecord->m_DicomFile[x];
					}
				}
				wcout << endl << "end of file" << endl << endl;
				wcout << "file record size " <<  _ImageRecord->m_dwDicomFileLength << endl;
				wcout << "file size =" << _ImageRecord->m_dwDicomFileLength << endl;
				wcout << "file stored by " << _ImageRecord->m_StoredBy << endl;
			}
			_ImageRecord->Close();
		}
		return;
}

//-------------------------------------------------------------------------------------------------
//			E N D   O F   F I L E
//-------------------------------------------------------------------------------------------------